<?php

namespace app\adminapi\controller;

use think\Controller;
use think\Request;

class Goods extends BaseApi
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        $keyword = input();
        $where = [];
        if (!empty($keyword["keyword"])) {
            $where["goods_name"] = ["like", "%{$keyword['keyword']}%"];
        }
        $data = \app\common\model\Goods::with("goods_cate,goods_type,goods_brand")->where($where)->order("id besc")->paginate(10);
        $this->ok($data);
    }
    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        # 接收数据
        $params = input();
        # 数据检测
        $validata = $this->validate($params, [
            "goods_name|商品名称" => "require|max:100",
            "goods_remark|商品简介" => "require",
            "cate_id|商品分类id" => "require",
            "brand_id|商品品牌id" => "require",
            "brand_id|商品品牌id" => "require",
            "goods_price|商品价格" => "require|float|gt:0",
            "market_price|市场价格" => "require|number|gt:0",
            "cost_price|成本价格" => "require|number|gt:0",
            "goods_logo|商品logo" => "require",
            "is_free_shipping|是否包邮" => "require|in:0,1",
            "goods_images|相册图片集合" => "require|array",
            "type_id|商品模型id" => "require",
            "item|商品规格值集合" => "require",
            "attr|商品属性值集合" => "require",
        ]);
        if ($validata !== true) {
            $this->fail($validata);
        }
        # 数据处理
        # 开启事务
        \think\Db::startTrans();
        try {
            # 判断他有没上传图片 如果有能找的到那就生成下缩略图
            if (is_file("." . $params["goods_logo"])) {
                # 生成新的名称
                $goods_logo_name = dirname($params["goods_logo"]) . DS . "goods_logo_thumb_" . basename($params["goods_logo"]);
                # 生成缩略图
                \think\Image::open("." . $params["goods_logo"])->thumb(200, 240)->save(".".$goods_logo_name);
                # 重新保存到数据库
                $params["goods_logo"] = $goods_logo_name;
            } else {
                # 没有找到那就给一个提示
                $this->fail("图片不存在");
            }
            $params["goods_attr"] = json_encode($params["attr"], JSON_UNESCAPED_UNICODE);
            $goods = \app\common\model\Goods::create($params, true);
            # 添加goods_image表数据 是一个数组
            $goods_image_data = [];
            foreach ($params["goods_images"] as $k => $v) {
                # 生成800*800的缩略图 重新设置800图片的名称
                $pics_big = dirname($v) . DS . "800_goods_image_thumb_" . basename($v);
                # 生成400*400的缩略图 重新设置名称
                $pics_sma = dirname($v) . DS . "400_goods_image_thumb_" . basename($v);
                # 打开图片
                $img = \think\Image::open("." . $v);
                # 生成800*800图片
                $img->thumb(800, 800)->save(".".$pics_big);
                # 生成400*40图片
                $img->thumb(400, 400)->save(".".$pics_sma);
                $goods_image_data[] = [
                    "goods_id" => $goods["id"],
                    "pics_big" => $pics_big,
                    "pics_sma" => $pics_sma
                ];
            }
            $goods_img_model = new \app\common\model\GoodsImages();
            $goods_img_model->saveAll($goods_image_data);
            $goods_item = [];
            foreach ($params["item"] as $v) {
                $v["goods_id"] = $goods["id"];
                $goods_item[] = $v;
            }
            $goods_item_model = new \app\common\model\SpecGoods();
            $goods_item_model->saveAll($goods_item);
            # 提交事务
            \think\Db::commit();
            $data = \app\common\model\Goods::with("category,brand,goods_image,goods_spec")->find($goods["id"]);
            # 提交数据
            # 返回数据
            $this->ok($data);
        } catch (\Exception $e) {
            # 回滚事务
            \think\Db::rollback();
            $msg = $e->getMessage();
            $line = $e->getLine();
            $file = $e->getFile();
            # 记录日志
            // trace("goods.save商品添加".$msg,"error");
            // $this->fail();
            # 返回数据
            $this->fail($msg . $file . $line);
        }
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        # 根据ID查询一条数据
        $find = \app\common\model\Goods::with("category,brand,goods_image,goods_spec")->find($id);
        # 在type模型里面关联查询到 attribute表 、spec表 、spec_values表 获取出里面的数据，并将他重新赋值给定义的下标为type
        $find["type"] = \app\common\model\Type::with("specs,attribute,specs.spec_value")->find(["id", $find["type_id"]]);
        # 返回数据
        $this->ok($find);
    }

    /**
     * 显示编辑资源表单页.
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function edit($id)
    {
        # 查询到goods表里面的所有数据 分类表category 商品图片表goods_image 规格表spec_goods表数据
        $goods_find = \app\common\model\Goods::with("category,brand,goods_image,goods_spec")->find($id);
        # 查询到type商品类型表里面的数据 类型规格表spec_value 商品属性表 attribute 里面的所有数据
        $goods_find["type"] = \app\common\model\Type::with("specs,attribute,specs.spec_value")->find($goods_find["type_id"]);
        # 查询到type里面的数据返回到前端用于下拉框选择
        $type = \app\common\model\Type::select();
        # 查询所有的顶级商品分类 
        $goods_one = \app\common\model\Category::where("pid", 0)->select();
        # 获取到goods表里面的商品分类category里面pid_path里面的数据 
        $pid = $goods_find["category"]["pid_path"];
        // echo $pid;die;  # 0_2_71 
        # 查询一级里面的所有二级分类
        $goods_two = \app\common\model\Category::where("pid", $pid[2])->select();
        # 查询二级里面的所有三级分类
        $goods_three = \app\common\model\Category::where("pid", $pid[4])->select();
        # 拼接数据
        $ret = [
            "goods" => $goods_find,
            "type"  => $type,
            "category" => [
                "goods_one" => $goods_one,
                "goods_two" => $goods_two,
                "goods_three" => $goods_three
            ]
        ];
        # 返回数据
        $this->ok($ret);
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        # 接收数据
        $params = input();
        # 数据检测
        $validata = $this->validate($params, [
            "goods_name|商品名称" => "require|max:100",
            "goods_remark|商品简介" => "require",
            "cate_id|商品分类id" => "require",
            "brand_id|商品品牌id" => "require",
            "brand_id|商品品牌id" => "require",
            "goods_price|商品价格" => "require|float|gt:0",
            "market_price|市场价格" => "require|number|gt:0",
            "cost_price|成本价格" => "require|number|gt:0",
            // "goods_logo|商品logo" => "require",
            "is_free_shipping|是否包邮" => "require|in:0,1",
            "goods_images|相册图片集合" => "array",
            "type_id|商品模型id" => "require",
            "item|商品规格值集合" => "require",
            "attr|商品属性值集合" => "require",
        ]);
        if ($validata !== true) {
            $this->fail($validata);
        }
        # 数据处理
        # 开启事务
        \think\Db::startTrans();
        try {
            # 判断他有没上传图片 如果有能找的到那就生成下缩略图
            if (!empty($params["goods_logo"]) && is_file("." . $params["goods_logo"])) {
                # 生成新的名称
                $goods_logo_name = dirname($params["goods_logo"]) . DS . "goods_logo_thumb_" . basename($params["goods_logo"]);
                # 生成缩略图
                \think\Image::open("." . $params["goods_logo"])->thumb(200, 240)->save(".".$goods_logo_name);
                # 重新保存到数据库
                $params["goods_logo"] = $goods_logo_name;
            }
            $params["goods_attr"] = json_encode($params["attr"], JSON_UNESCAPED_UNICODE);
            \app\common\model\Goods::update($params, ["id" => $id], true);
            # 添加goods_image表数据 是一个数组
            # 判断他是否有上传图片
            if (isset($params["goods_images"])) {
                $goods_image_data = [];
                foreach ($params["goods_images"] as $k => $v) {
                    # 判断他的图片是否存在
                    if (!is_file("." . $v)) continue;
                    # 生成800*800的缩略图 重新设置800图片的名称
                    $pics_big = dirname($v) . DS . "800_goods_image_thumb_" . basename($v);
                    # 生成400*400的缩略图 重新设置名称
                    $pics_sma = dirname($v) . DS . "400_goods_image_thumb_" . basename($v);
                    # 打开图片
                    $img = \think\Image::open("." . $v);
                    # 生成800*800图片
                    $img->thumb(800, 800)->save(".".$pics_big);
                    # 生成400*40图片
                    $img->thumb(400, 400)->save(".".$pics_sma);
                    $goods_image_data[] = [
                        "goods_id" => $id,
                        "pics_big" => $pics_big,
                        "pics_sma" => $pics_sma
                    ];
                }
                $goods_img_model = new \app\common\model\GoodsImages();
                $goods_img_model->saveAll($goods_image_data);
            }
            # 判断他是否上传item
            if (!empty($params["item"]) && isset($params["item"])) {
                \app\common\model\SpecGoods::destroy(["goods_id" => $id]);
                $goods_item = [];
                foreach ($params["item"] as $v) {
                    $v["goods_id"] = $id;
                    $goods_item[] = $v;
                }
                $goods_item_model = new \app\common\model\SpecGoods();
                $goods_item_model->saveAll($goods_item);
            }
            # 提交事务
            \think\Db::commit();
            $data = \app\common\model\Goods::with("category,brand,goods_image,goods_spec")->find($id);
            # 提交数据
            # 返回数据
            $this->ok($data);
        } catch (\Exception $e) {
            # 回滚事务
            \think\Db::rollback();
            $msg = $e->getMessage();
            $line = $e->getLine();
            $file = $e->getFile();
            # 记录日志
            // trace("goods.save商品修改".$msg,"error");
            # 返回数据
            // $this->fail();
            $this->fail($msg . $file . $line);
        }
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        # 根据他传入的id获取到一条数据，可以使用value获取到指定的字段
        $is_on_sale = \app\common\model\Goods::where("id", $id)->value("is_on_sale");
        # 判断他是否上架，如果为1那就true，就是上架了，不能删除，为0是false可以删除，就往下执行
        if ($is_on_sale) {
            $this->fail("商品已上架，不能删除 请先下架后再删除");
        }
        # 删除数据
        \app\common\model\Goods::destroy($id);
        # 根据id查询到goods_image里面的商品图片
        $goods_image = \app\common\model\GoodsImages::where("goods_id", $id)->select();
        # 删除数据库里面的图片
        \app\common\model\GoodsImages::destroy(["goods_id"=>$id]);
        $img = [];
        # 循环获取到的图片并重新赋值到空的数组里面
        foreach ($goods_image as $k => $v) {
            $img[] = $v["pics_big"];
            $img[] = $v["pics_sma"];
        }
        # 循环图片
        foreach ($img as $k => $v) {
            # 判断是否能够找的图片文件，如果找到了就从磁盘上面删除图片
            if (is_file("." . $v)) {
                unlink("." . $v);
            }
        }
        $this->ok("删除成功");
    }
    # 删除图片
    public function delpic($id){
        # 根据他传入进来的id云查询到一条数据
        $find = \app\common\model\GoodsImages::find($id);
        # 判断能不能查询到数据，如果不能那就是已经删除了，直接返回数据
        if(!$find){
            $this->ok("已删除图片");
        }
        # 查询到了那就删除数据
        $find->delete();
        # 判断他图片文件能不能在文件中找的到，如果找到那就删除
        if(is_file(".".$find["pics_big"])){
            unlink("." . $find["pics_big"]);
        }
        # 判断他图片文件能不能在文件中找的到，如果找到那就删除
        if(is_file(".".$find["pics_sma"])){
            unlink("." . $find["pics_sma"]);
        }
        $this->ok("删除图片成功");
    }
}
